// 开启严格模式
'use strict';

// 提示类名
var PROMPT = '.modal_frame-form-prompt';
var SHOW = 'down';
// 成功类名
var SUCCESS = 'success';
// 错误类名
var ERROR = 'error';
// 请求类型
var METHOD = '';
// 请求地址
var URL = '';
// 修改密码请求地址
var MODIFYPASSWORDURL = '';

/**
 * 初始化
 * @return void
 */
(function init() {
    // 变化校验
    changeRules('check');
    // 修改密码变化校验
    modifyPasswordChangeRules('check');
})()

/**
 * 重置表单
 * @return void
 */
function resetForm() {
    // 重置表单
    $('.modal_frame-form')[0].reset();
}

/**
 * 变化校验
 * @param {String} operation 操作
 * @return void
 */
function changeRules(operation) {
    // 登录名
    var name = $('#name');
    var namePattern = /^.{5,18}$/;
    // 密码、确认密码
    var password = $('#password');
    var confirm_password = $('#confirm_password');
    var passwordPattern = /^.{5,18}$/;
    // 角色
    var role = $('[name="role"]');
    var role_label = $('.modal_frame-form-item-radio-label');
    var role_item = $('.modal_frame-form-item.radio');

    switch (operation) {
        // 校验
        case 'check':
            // 登录名校验
            name.bind('input propertychange blur', function () {
                if ($(this).val() === '') {
                    $(this).siblings(PROMPT).text('登录名不能为空').addClass(SHOW);
                    $(this).removeClass(SUCCESS).addClass(ERROR);
                } else if (!namePattern.test($(this).val())) {
                    $(this).siblings(PROMPT).text('长度在 5 到 18 个字符').addClass(SHOW);
                    $(this).removeClass(SUCCESS).addClass(ERROR);
                } else {
                    $(this).siblings(PROMPT).removeClass(SHOW);
                    $(this).removeClass(ERROR).addClass(SUCCESS);
                }
            })

            // 密码校验
            password.bind('input propertychange blur', function () {
                if ($(this).val() === '') {
                    $(this).siblings(PROMPT).text('密码不能为空').addClass(SHOW);
                    $(this).removeClass(SUCCESS).addClass(ERROR);
                } else if (!passwordPattern.test($(this).val())) {
                    $(this).siblings(PROMPT).text('长度在 5 到 18 个字符').addClass(SHOW);
                    $(this).removeClass(SUCCESS).addClass(ERROR);
                } else {
                    $(this).siblings(PROMPT).removeClass(SHOW);
                    $(this).removeClass(ERROR).addClass(SUCCESS);
                }
            })

            // 确认密码校验
            confirm_password.bind('input propertychange blur', function () {
                if ($(this).val() === '') {
                    $(this).siblings(PROMPT).text('确认密码不能为空').addClass(SHOW);
                    $(this).removeClass(SUCCESS).addClass(ERROR);
                } else if (!passwordPattern.test($(this).val())) {
                    $(this).siblings(PROMPT).text('长度在 5 到 18 个字符').addClass(SHOW);
                    $(this).removeClass(SUCCESS).addClass(ERROR);
                } else if (confirm_password.val() !== password.val()) {
                    $(this).siblings(PROMPT).text('两次密码不一致').addClass(SHOW);
                    $(this).removeClass(SUCCESS).addClass(ERROR);
                } else {
                    $(this).siblings(PROMPT).removeClass(SHOW);
                    $(this).removeClass(ERROR).addClass(SUCCESS);
                    password.siblings(PROMPT).removeClass(SHOW);
                    password.removeClass(ERROR).addClass(SUCCESS);
                }
            })


            // 角色校验
            role.bind('change', function () {
                $(this).parent().siblings(PROMPT).removeClass(SHOW);
                role_label.removeClass(ERROR).addClass(SUCCESS);
                role_item.children('.fa-times-circle').css({'opacity': 0, 'filter': 'alpha(opacity=0)'}).siblings('.fa-check-circle').css({'opacity': 1, 'filter': 'alpha(opacity=100)'});
            })
            break;
        // 重置校验
        case 'reset':
            // 重置登录名
            name.removeClass(SUCCESS + ' ' + ERROR);
            name.siblings(PROMPT).removeClass(SHOW);
            // 重置密码
            password.removeClass(SUCCESS + ' ' + ERROR);
            password.siblings(PROMPT).removeClass(SHOW);
            // 重置确认密码
            confirm_password.removeClass(SUCCESS + ' ' + ERROR);
            confirm_password.siblings(PROMPT).removeClass(SHOW);
            // 重置角色
            role.removeClass(ERROR).parent().siblings(PROMPT).removeClass(SHOW);
            role_label.removeClass(SUCCESS + ' ' + ERROR);
            role_item.children('.fa-check-circle, .fa-times-circle').css({'opacity': 0, 'filter': 'alpha(opacity=0)'});
            // 重置表单
            resetForm();
            break;
    }
}

/**
 * 校验
 * @param {Boolean} isAdd 是否添加
 * @return void
 */
function rules(isAdd) {
    // 校验结果
    var result = true;
    // 登录名
    var name = $('#name');
    var namePattern = /^.{5,18}$/;
    // 密码、确认密码
    var password = $('#password');
    var confirm_password = $('#confirm_password');
    var passwordPattern = /^.{5,18}$/;
    // 角色
    var role_checkbox = $('[name="role"]:checked');
    var role = $('[name="role"]');
    var role_label = $('.modal_frame-form-item-radio-label');
    var role_item = $('.modal_frame-form-item.radio');

    // 登录名校验
    if (name.val() === '') {
        name.siblings(PROMPT).text('登录名不能为空').addClass(SHOW);
        name.addClass(ERROR);
        result = false;
    } else if (!namePattern.test(name.val())) {
        name.siblings(PROMPT).text('长度在 5 到 18 个字符').addClass(SHOW);
        name.addClass(ERROR);
        result = false;
    } else {
        name.addClass(SUCCESS);
    }

    // 判断是否添加
    if (isAdd) {
        // 密码校验
        if (password.val() === '') {
            password.siblings(PROMPT).text('密码不能为空').addClass(SHOW);
            password.addClass(ERROR);
            result = false;
        } else if (!passwordPattern.test(password.val())) {
            password.siblings(PROMPT).text('长度在 5 到 18 个字符').addClass(SHOW);
            password.addClass(ERROR);
            result = false;
        } else {
            password.addClass(SUCCESS);
        }

        // 确认密码校验
        if (confirm_password.val() === '') {
            confirm_password.siblings(PROMPT).text('确认密码不能为空').addClass(SHOW);
            confirm_password.addClass(ERROR);
            result = false;
        } else if (!passwordPattern.test(confirm_password.val())) {
            confirm_password.siblings(PROMPT).text('长度在 5 到 18 个字符').addClass(SHOW);
            confirm_password.addClass(ERROR);
            result = false;
        } else if (confirm_password.val() !== password.val()) {
            confirm_password.siblings(PROMPT).text('两次密码不一致').addClass(SHOW);
            confirm_password.addClass(ERROR);
            result = false;
        } else {
            confirm_password.addClass(SUCCESS);
        }
    }

    // 角色校验
    if (role_checkbox.val() === undefined) {
        role.addClass(ERROR).parent().siblings(PROMPT).text('请选择角色').addClass(SHOW);
        $(role_label).addClass(ERROR);
        role_item.children('.fa-times-circle').css({'opacity': 1, 'filter': 'alpha(opacity=100)'});
        result = false;
    } else {
        $(role_label).addClass(SUCCESS);
    }

    // 错误元素
    var error = $('#form-modal_frame .' + ERROR).eq(0);
    // 获取焦点
    error.focus();

    // 返回校验结果
    return result;
}

/**
 * 添加
 * @return void
 */
function add(url) {
    // 如果请求是PUT类型/重置变化校验
    if (METHOD === 'put') changeRules('reset');
    // 设置请求类型
    METHOD = 'post';
    // 设置请求地址
    URL = url;
    // 显示密码输入框
    $('#form-modal_frame .modal_frame-form-item.password').show();
    // 显示模态框
    showModalFrame('#form-modal_frame', '.form-modal_frame-container', '.form-modal_frame-title', true);
}

/**
 * 编辑
 * @param {Object} _this 当前DOM
 * @param {String} url 地址
 * @return void
 */
function edit(_this, url) {
    // 设置请求类型
    METHOD = 'put';
    // 设置请求地址
    URL = url;
    // 添加加载
    actionLoading(_this, 'add', 'icon');
    // 隐藏密码输入框
    $('#form-modal_frame .modal_frame-form-item.password').hide();
    // 请求数据
    axios.get(URL).then(function (res) {
        // 删除加载
        actionLoading(_this, 'remove', 'icon');
        // 重置变化校验
        changeRules('reset');
        // 设置登录名
        $('#name').val(res.data.data.name);
        // 设置角色
        $('#' + res.data.data.role).prop('checked', true);
        // 显示模态框
        showModalFrame('#form-modal_frame', '.form-modal_frame-container', '.form-modal_frame-title', true);
    }).catch(function (err) {
        // 消息提示
        message('add', 'error', err);
        // 删除加载
        actionLoading(_this, 'remove', 'icon');
    })
    
}

/**
 * 提交
 * @param {Object} _this 当前DOM
 * @return void
 */
function onSubmit(_this) {
    // 判断是否Post请求
    if (METHOD === 'post') {
        // 校验添加
        if (rules(true)) {
            // 添加加载
            actionLoading(_this, 'add', 'submit');
            // 请求
            request(_this);
        }
    } else {
        // 校验编辑
        if (rules()) {
            // 添加加载
            actionLoading(_this, 'add', 'submit');
            // 请求
            request(_this);
        }
    }
}

/**
 * 请求
 * @param {Object} _this 当前DOM
 * @param {String} imgName 图片名称
 * @return void
 */
function request(_this) {
    // 获取数据
    var data = {
        name: $('#name').val(),
        role: $('[name="role"]:checked').val()
    };
    // 判断是否POST请求/设置密码
    if (METHOD === 'post') data.password = rsaEncrypt($('#password').val());

    // 发送请求
    axios({
        method: METHOD,
        url: URL,
        data: data
    }).then(function (res) {
        // 消息提示
        message('add', res.data.type, res.data.message);
        // 删除加载
        actionLoading(_this, 'remove', 'submit');
        if (res.data.state === 200) {
            // 隐藏模态框
            hideModalFrame(event, '#form-modal_frame', true);
            // 重置变化校验
            changeRules('reset');
            // 延迟定时器
            setTimeout(function () {
                // 刷新页面
                window.location.reload();
            }, 400);
        }
    }).catch(function (err) {
        // 消息提示
        message('add', 'err', err);
        // 删除加载
        actionLoading(_this, 'remove', 'submit');
    })
}

/**
 * 重置修改密码表单
 * @return void
 */
function resetmodifyPasswordForm() {
    // 重置表单
    $('.modal_frame-form')[1].reset();
}

/**
 * 变化校验
 * @param {String} operation 操作
 * @return void
 */
function modifyPasswordChangeRules(operation) {
    // 密码
    var old_password = $('#old_password');
    var new_password = $('#new_password');
    var confirm_new_password = $('#confirm_new_password');
    var passwordPattern = /\w{5,18}/;

    switch (operation) {
        // 校验
        case 'check':
            // 旧密码校验
            old_password.bind('input propertychange blur', function () {
                if ($(this).val() === '') {
                    $(this).siblings(PROMPT).text('旧密码不能为空').addClass(SHOW);
                    $(this).removeClass(SUCCESS).addClass(ERROR);
                } else if (!passwordPattern.test($(this).val())) {
                    $(this).siblings(PROMPT).text('长度在 5 到 18 个字符').addClass(SHOW);
                    $(this).removeClass(SUCCESS).addClass(ERROR);
                } else {
                    $(this).siblings(PROMPT).removeClass(SHOW);
                    $(this).removeClass(ERROR).addClass(SUCCESS);
                }
            })

            // 新密码校验
            new_password.bind('input propertychange blur', function () {
                if ($(this).val() === '') {
                    $(this).siblings(PROMPT).text('新密码不能为空').addClass(SHOW);
                    $(this).removeClass(SUCCESS).addClass(ERROR);
                } else if (!passwordPattern.test($(this).val())) {
                    $(this).siblings(PROMPT).text('长度在 5 到 18 个字符').addClass(SHOW);
                    $(this).removeClass(SUCCESS).addClass(ERROR);
                } else {
                    $(this).siblings(PROMPT).removeClass(SHOW);
                    $(this).removeClass(ERROR).addClass(SUCCESS);
                }
            })

            // 确认新密码校验
            confirm_new_password.bind('input propertychange blur', function () {
                if ($(this).val() === '') {
                    $(this).siblings(PROMPT).text('确认新密码不能为空').addClass(SHOW);
                    $(this).removeClass(SUCCESS).addClass(ERROR);
                } else if (!passwordPattern.test($(this).val())) {
                    $(this).siblings(PROMPT).text('长度在 5 到 18 个字符').addClass(SHOW);
                    $(this).removeClass(SUCCESS).addClass(ERROR);
                } else if (confirm_new_password.val() !== new_password.val()) {
                    $(this).siblings(PROMPT).text('两次密码不一致').addClass(SHOW);
                    $(this).removeClass(SUCCESS).addClass(ERROR);
                } else {
                    $(this).siblings(PROMPT).removeClass(SHOW);
                    $(this).removeClass(ERROR).addClass(SUCCESS);
                    new_password.siblings(PROMPT).removeClass(SHOW);
                    new_password.removeClass(ERROR).addClass(SUCCESS);
                }
            })
            break;
        // 重置校验
        case 'reset':
            // 重置旧密码
            old_password.removeClass(SUCCESS + ' ' + ERROR);
            old_password.siblings(PROMPT).removeClass(SHOW);
            // 重置新密码
            new_password.removeClass(SUCCESS + ' ' + ERROR);
            new_password.siblings(PROMPT).removeClass(SHOW);
            // 重置确认新密码
            confirm_new_password.removeClass(SUCCESS + ' ' + ERROR);
            confirm_new_password.siblings(PROMPT).removeClass(SHOW);
            // 重置修改密码表单
            resetmodifyPasswordForm();
            break;
    }
}

/**
 * 修改密码校验
 * @return void
 */
function modifyPasswordRules() {
    // 校验结果
    var result = true;
    // 旧密码、新密码、确认新密码
    var old_password = $('#old_password');
    var new_password = $('#new_password');
    var confirm_new_password = $('#confirm_new_password');
    var passwordPattern = /\w{5,18}/;

    // 旧密码校验
    if (old_password.val() === '') {
        old_password.siblings(PROMPT).text('旧密码不能为空').addClass(SHOW);
        old_password.addClass(ERROR);
        result = false;
    } else if (!passwordPattern.test(old_password.val())) {
        old_password.siblings(PROMPT).text('长度在 5 到 18 个字符').addClass(SHOW);
        old_password.addClass(ERROR);
        result = false;
    } else {
        old_password.addClass(SUCCESS);
    }

    // 新密码校验
    if (new_password.val() === '') {
        new_password.siblings(PROMPT).text('新密码不能为空').addClass(SHOW);
        new_password.addClass(ERROR);
        result = false;
    } else if (!passwordPattern.test(new_password.val())) {
        new_password.siblings(PROMPT).text('长度在 5 到 18 个字符').addClass(SHOW);
        new_password.addClass(ERROR);
        result = false;
    } else {
        new_password.addClass(SUCCESS);
    }

    // 确认密码校验
    if (confirm_new_password.val() === '') {
        confirm_new_password.siblings(PROMPT).text('确认新密码不能为空').addClass(SHOW);
        confirm_new_password.addClass(ERROR);
        result = false;
    } else if (!passwordPattern.test(confirm_new_password.val())) {
        confirm_new_password.siblings(PROMPT).text('长度在 5 到 18 个字符').addClass(SHOW);
        confirm_new_password.addClass(ERROR);
        result = false;
    } else if (confirm_new_password.val() !== confirm_new_password.val()) {
        confirm_new_password.siblings(PROMPT).text('两次密码不一致').addClass(SHOW);
        confirm_new_password.addClass(ERROR);
        result = false;
    } else {
        confirm_new_password.addClass(SUCCESS);
    }

    // 错误元素
    var error = $('#modify_password-modal_frame .' + ERROR).eq(0);
    // 获取焦点
    error.focus();

    // 返回校验结果
    return result;
}

/**
 * 修改密码
 * @param {String} url 地址
 * @return void
 */
function modifyPassword(url) {
    // 设置请求地址
    MODIFYPASSWORDURL = url;
    // 显示模态框
    showModalFrame('#modify_password-modal_frame', '.modify_password-modal_frame-container', '.modify_password-modal_frame-title', true);
}

/**
 * 提交修改密码
 * @param {Object} _this 当前DOM
 * @return void
 */
function submitModifyPassword(_this) {
    // 校验
    if (modifyPasswordRules()) {
        // 添加加载
        actionLoading(_this, 'add', 'submit');

        // 获取数据
        var data = {
            old_password: rsaEncrypt($('#old_password').val()),
            new_password: rsaEncrypt($('#new_password').val()),
        };

        // 发送请求
        axios({
            method: 'put',
            url: MODIFYPASSWORDURL,
            data: data
        }).then(function (res) {
            // 消息提示
            message('add', res.data.type, res.data.message);
            // 删除加载
            actionLoading(_this, 'remove', 'submit');
            if (res.data.state === 200) {
                // 隐藏模态框
                hideModalFrame(event, '#modify_password-modal_frame', true);
                // 重置修改密码变化校验
                modifyPasswordChangeRules('reset');
                // 重置修改密码表单
                resetmodifyPasswordForm();
            }
        }).catch(function (err) {
            // 消息提示
            message('add', 'error', err);
            // 删除加载
            actionLoading(_this, 'remove', 'submit');
        })
    }
}

/**
 * 删除
 * @param {Type} _this 当前DOM
 * @param {Type} url 地址
 * @return void
 */
function onDelete(_this, url) {
    // 显示确认框
    confirmation(event, 'show', function () {
        // 隐藏确认框
        confirmation(event, 'hide');

        // 添加加载
        actionLoading(_this, 'add', 'icon');

        // 发送请求
        axios.delete(url).then(function (res) {
            // 消息提示
            message('add', res.data.type, res.data.message);

            // 删除加载
            actionLoading(_this, 'remove', 'icon');

            // 判断是否删除成功
            if (res.data.state === 200) $(_this).parents('.table-tr').remove();    // 删除数据
        }).catch(function (err) {
            // 消息提示
            message('add', 'error', err);

            // 删除加载
            actionLoading(_this, 'remove', 'icon');
        })
    })
}